package our.pack;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class PointsDataSource {
	
	private SQLiteDatabase database;
	private DatabaseHelper dbHelper;
	private String[] allColums = { DatabaseHelper.getPointsID(), DatabaseHelper.getPointsLat(),DatabaseHelper.getPointsLong(), DatabaseHelper.getTrackID() };
	
	public PointsDataSource(Context context){
		dbHelper = new DatabaseHelper(context);
	}
	
	/**
	 *  opens the database
	 * @throws SQLException
	 */
	public void open() throws SQLException {
		database = dbHelper.getWritableDatabase();
	}
	
	/**
	 * closes the database
	 */
	public void close() {
		dbHelper.close();
	}
	
	/**
	 * Eerst worden de waardes in de database gestopt, vervolgens wordt er een cursor aangemaakt die de laatste entry in de database afleest
	 * de cursorToPoint(Cursor cursor) functie zorgt vervolgens dat er een MyPoint object wordt aangemaakt met de laatste waardes uit de database
	 * 
	 * @param latitude
	 * @param longitude
	 * @param track
	 * van track wordt de trackId opgehaald, het gemaakte punt wordt aan deze trackId gebonden zodat per track de punten kunnen worden opgehaald
	 * @return
	 */
	public MyPoint createPoint(int latitude, int longitude, Track track ) {
		ContentValues values = new ContentValues();
		values.put(DatabaseHelper.getPointsLat(), latitude);
		values.put(DatabaseHelper.getPointsLong(), longitude);
		values.put(DatabaseHelper.getTrackID(), track.getID());
		long instertId = database.insert(DatabaseHelper.getPointsTable(), null, values);
		Cursor cursor = database.query(DatabaseHelper.getPointsTable(), allColums, DatabaseHelper.getPointsID(), null, null, null, null);
		cursor.moveToLast();
		MyPoint newPoint = cursorToPoint(cursor);
		cursor.close();
		return newPoint;
		
	}
	
	public void deletePoint(MyPoint point)
	{
		long id = point.getPointsID();
		database.delete(DatabaseHelper.getPointsTable(), DatabaseHelper.getPointsID() + " = " + id, null);
		
	}
	
	/**
	 * maakt een nieuw MyPoint object aan voor de row van de database waar de cursor op staat
	 * 
	 * @param cursor
	 * @return
	 * geeft een MyPoint object terug
	 */
	private MyPoint cursorToPoint(Cursor cursor){
		MyPoint point = new MyPoint();
		point.setPointsID(cursor.getLong(0));
		point.setLatitude(cursor.getInt(1));
		point.setLongitude(cursor.getInt(2));
		point.setTrackID(cursor.getLong(3));
//		track.setTrackName(cursor.getString(1));
		return point;
	}
	
	public List<MyPoint> getAllPoints()
	{
		List<MyPoint> points = new ArrayList<MyPoint>();
		
		Cursor cursor = database.query(DatabaseHelper.getPointsTable(), allColums, null, null, null, null, null);
		cursor.moveToFirst();
		while(!cursor.isAfterLast()) {
			MyPoint point = cursorToPoint(cursor);
			points.add(point);
			cursor.moveToNext();
		}
		
		cursor.close();
		return points;
	}
	
	public void removeAllPoints(){
		for(MyPoint p : getAllPoints() )
		{
			deletePoint(p);
		}
	}
	
	/**
	 * Kijkt voor alle punten of ze dezelfde trackId hebben als de meegegeven track, als dit zo is worden ze aan een List toegevoegd
	 * 
	 * @param track
	 * @return geeft een list terug met daarin de punten waarbij de trackId hetzelfde is als de meegegeven track
	 */
	public List<MyPoint> getPointsByTrack(Track track)
	{
		List<MyPoint> points = new ArrayList<MyPoint>();
		
		Cursor cursor = database.query(DatabaseHelper.getPointsTable(), allColums, DatabaseHelper.getTrackID() + "=" + track.getID(), null, null, null , null);
		cursor.moveToFirst();
		while(!cursor.isAfterLast()){
			MyPoint point = cursorToPoint(cursor);
			points.add(point);
			cursor.moveToNext();
		}
		
		cursor.close();
		return points;
	}

}
